/**
 * 在这里定义与token相关的路由处理函数，供/router/token.js模块使用
 */

// 导入db模块
const db = require('../db/index')
// 用这个包来生成Token字符串
const jwt = require('jsonwebtoken')
// 导入全局的配置文件
const config = require('../config') 

// token刷新接口
exports.refreshToken = (req, res) => {
  // 从cookie获取refreshToken
  const refreshToken = req.cookies.refresh_token
  // 判断refreshToken是否存在
  if (!refreshToken) {
    return res.status(400).json({ code: 400, message: '缺少refreshToken，请先登录' })
  }
  
  try {
    // 验证refreshToken
    const decoded = jwt.verify(refreshToken, config.refreshTokenSecretKey)
    
    // 查询用户是否存在且refreshToken匹配
    const sql = 'SELECT id, username, phone, email, status, refresh_token, expires_at FROM user WHERE id = ?'
    db.query(sql, [decoded.id], (err, results) => {
      if (err) {
        console.error('刷新token数据库查询错误:', err)
        return res.status(500).json({ code: 500, message: '服务器内部错误' })
      }
      
      if (results.length === 0) {
        return res.status(401).json({ code: 401, message: '用户不存在，请重新登录' })
      }
      
      const user = results[0]
      
      // 检查用户状态
      if (user.status === 'disabled') {
        return res.status(403).json({ code: 403, message: '账户已被禁用' })
      }
      
      // 验证refreshToken是否匹配
      if (user.refresh_token !== refreshToken) {
        return res.status(401).json({ code: 401, message: 'refreshToken不匹配，请重新登录' })
      }
      
      // 检查refreshToken是否过期
      if (user.expires_at && new Date() > new Date(user.expires_at)) {
        return res.status(403).json({ code: 403, message: 'refreshToken已过期，请重新登录' })
      }
      
      // 生成新的accessToken
      const accessToken = jwt.sign(
        { id: user.id, username: user.username, phone: user.phone, email: user.email },
        config.jwtSecretKey,
        { expiresIn: config.accessExpiresIn }
      )
      
      // 更新accessToken到Cookie
      res.cookie('token', accessToken, {
        maxAge: config.accessExpiresInSec * 1000,
        httpOnly: true,
        secure: true,
        path: '/',
        sameSite: 'none'   // 支持跨域
      })
      
      res.status(200).json({
        code: 200,
        message: 'accessToken刷新成功',
        data: {
          token: accessToken
        }
      })
    })
  } catch (error) {
    console.error('刷新token验证错误:', error.message)
    
    if (error.name === 'TokenExpiredError') {
      return res.status(403).json({ code: 403, message: 'refreshToken已过期，请重新登录' })
    } else if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({ code: 401, message: '无效的refreshToken' })
    } else {
      return res.status(500).json({ code: 500, message: '服务器内部错误' })
    }
  }
}

